package br.com.sms.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.sms.conexao.Conexao;
import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Mensagem;

public class MensagemDAO {
	
	private EntityManager manager;
	private Conexao conexao;
	public MensagemDAO(){
		if(conexao == null){
			conexao = new Conexao();
		}
	}
	
	/**
	 * Descrição: Salva ou atualiza a mensagem no DB.
	 * @param mensagem
	 */
	public void salvarMensagem(Mensagem mensagem){
		manager = conexao.getEntityManger();
		manager.getTransaction().begin();
		if(mensagem.getId() > 0){
			manager.merge(mensagem);
		}else{
			manager.persist(mensagem);
		}
		manager.getTransaction().commit();
		conexao.finalizaConexao();
	}
	
	/**
	 * Descrição: Recupera a mensagem específica passando o id da mensagem.
	 * @param mensagem
	 * @return
	 */
	public Mensagem recuperarMensagem(Mensagem mensagem){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select m from Mensagem m where m.id = :id");
		query.setParameter("id", mensagem.getId());
		Mensagem msg = (Mensagem)query.getSingleResult();
		conexao.finalizaConexao();
		return msg;
	}
	
	/**
	 * Descrição: Recupera uma lista de mensagem apartir do titulo usando operador like.
	 * @param titulo
	 * @return
	 */
	public List<Mensagem> recuperarMensagem(String titulo, Cliente cliente){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery(montaQuery(titulo, cliente));
		
		if(titulo != null && titulo.trim().length() > 0)
			query.setParameter("titulo", "%"+titulo+"%");
		if(cliente != null)
			query.setParameter("cliente", cliente.getId());

		List<Mensagem> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}
	
	private String montaQuery(String titulo, Cliente cliente){
		StringBuilder builder = new StringBuilder();
		boolean possuiWhere = false;
		builder.append("select m from Mensagem m ");
		if(titulo != null && titulo.trim().length() > 0){
			builder.append("where m.tituloMensagem like :titulo ");
			possuiWhere = true;
		}
		
		if(cliente != null){
			if(possuiWhere)
				builder.append("and m.usuario.cliente.id = :cliente");
			else
				builder.append("where m.usuario.cliente.id = :cliente");
		}
		return builder.toString();
	}
	
	/**
	 * Descrição: Efetua a exclusão da mesnagem.
	 * @param mensagem
	 */
	public void removerMensagem(Mensagem mensagem){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select m from Mensagem m where m.id = :id");
		query.setParameter("id", mensagem.getId());
		Mensagem mensagem2 = (Mensagem)query.getSingleResult();
		manager.getTransaction().begin();
		manager.remove(mensagem2);
		manager.getTransaction().commit();
		conexao.finalizaConexao();
	}
	
	/**
	 * Descrição: Recupera todas as mensagens.
	 * @param mensagem
	 */
	public List<Mensagem> recuperarTodasMensagens(Cliente cliente){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery(montaQuery(null, cliente));
		if(cliente != null)
			query.setParameter("cliente", cliente.getId());
		List<Mensagem> lista =  query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}
}
